/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package starfox.personagens;

import java.util.ArrayList;
import java.util.Iterator;
import org.newdawn.slick.Animation;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.geom.Vector2f;
import util.CaixaColisao;
import util.StopWatch;

/**
 *
 * @author Lucas
 */

//Classe abstrata para as mãos
public abstract class AndrossMao {
    //Sprite da mão, usado como uma imagem animada
    Animation sprite = null;
    //Imagem com os 2 sprites da mão
    SpriteSheet sprites = null;

    //Posições da mão e da Arwing
    Vector2f pos = new Vector2f();
    Vector2f arwPos = new Vector2f();

    //Tempo para controlar a frequência dos tiros
    StopWatch controleTiros = null;

    //Caixa de colisão
    CaixaColisao box = null;

    int vidas = 30;

    //ArrayList de tiros. O tiro das mãos é do mesmo tipo do 3º set de inimigos.
    ArrayList<TiroInimigo3> tiros = null;
    //Tiro temporário, para ser adicionado à ArrayList
    TiroInimigo3 tiro;

    //Desenhar a mão e os tiros, caso haja algum
    public void render(){
        sprite.draw(pos.x, pos.y);
        for(TiroInimigo3 t : tiros)
            t.render();
    }

    public Vector2f getPos(){
        return pos;
    }

    public CaixaColisao getCaixaColisao(){
        return box;
    }

    public void diminuirVidas(){
        vidas--;
    }

    public int getVidas(){
        return vidas;
    }

    public ArrayList<TiroInimigo3> getTiros(){
        return tiros;
    }

    //Como cada mão fica em uma posição diferente, este método deve ser implementado por cada mão
    public abstract void setPos(AndrossCabeca and);

    public void update(int delta, AndrossCabeca and, Arwing arw) throws SlickException {
        //Se a cabeça ainda não chegou a certa posição, atualizar a posição das mãos, seguindo-a
        if(and.getPos().y < 50) setPos(and);

        //Iniciar o controle de tiros
        if(pos.y > 0 && !controleTiros.isRunning()) controleTiros.start();

        //Pegar a posição da Arwing para mirar
        arwPos.x = arw.getPos().x + arw.getWidth()/2;
        arwPos.y = arw.getPos().y + arw.getHeight()/2;

        //Atirar depois de um tempo
        if(controleTiros.getElapsedTime() >= 800){
                tiro = new TiroInimigo3(pos.x+sprite.getWidth()/2, pos.y+sprite.getHeight(), arwPos);
                tiros.add(tiro);
                controleTiros.reset();
        }
        //Mover os tiros, removendo-os da ArrayList caso saiam da tela
        for(Iterator<TiroInimigo3> it = tiros.iterator(); it.hasNext();) {
                tiro = it.next();
                tiro.update(delta);
                if(tiro.getPos().y > 600 || tiro.getPos().y < 0-tiro.getHeight() || tiro.getPos().x < 0-tiro.getWidth() || tiro.getPos().x > 800)
                    it.remove();
        }
    }
}